package com.lw.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author LW
 * @2020/8/20 15:14
 */
public class BlockingQueueTest {

    public static void main(String[] args) throws InterruptedException {
        test3();

    }
    /**
     *  抛出异常
     */
    public static void test1(){
        //队列的大小
        ArrayBlockingQueue queue = new ArrayBlockingQueue<>(3);
        System.out.println(queue.add("a"));
        System.out.println(queue.add("b"));
        System.out.println(queue.add("c"));
        //队列满了   java.lang.IllegalStateException: Queue full
//        System.out.println(queue.add("d"));

        System.out.println(queue.element());//检测队首元素

        System.out.println("==========**=============");
        System.out.println(queue.remove());//取，顺序去除
        System.out.println(queue.remove());
        System.out.println(queue.remove());
        //全部取出后，   再取  报异常java.util.NoSuchElementException没有这样的元素
//        System.out.println(queue.remove());
    }

    /**
     * 有返回值。没有异常
     */
    public static void test2(){
        //队列的大小
        ArrayBlockingQueue queue = new ArrayBlockingQueue<>(3);
        //存和取的方法变了   offer存   poll取
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        //满了以后。不再抛出异常，而是返回一个   布尔值   false
//        System.out.println(queue.offer("d"));

        System.out.println(queue.peek());//检测队首元素

        System.out.println(queue.poll());//空参的poll()  *** 有参的是延时的
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        // 队列中没得了     返回   null
//        System.out.println(queue.poll());
    }

    /**
     * 等待，阻塞（一直阻塞）
     */
    public static void test3(){
        //队列的大小
        ArrayBlockingQueue queue = new ArrayBlockingQueue<>(3);
        //一直阻塞
        try {
            queue.put("a");
            System.out.println(Thread.currentThread().getName()+"-->"+"put a");
            queue.put("b");
            System.out.println(Thread.currentThread().getName()+"-->"+"put b");
            queue.put("c");
            System.out.println(Thread.currentThread().getName()+"-->"+"put c");
//            queue.put("d");//队列没有位置，就一直等待
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
//            System.out.println(queue.take());//不会报错，也不会抛异常，就一直等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 等待
     */
    public static void test4() throws InterruptedException {
        //队列的大小
        ArrayBlockingQueue queue = new ArrayBlockingQueue<>(3);

        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d",2,TimeUnit.SECONDS));//等待两秒，阻塞就返回false

        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll(2,TimeUnit.SECONDS));//超时就返回null
    }
}
